package cn.felord.spring.security.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

/**
 * 可重复读取 ServletRequest 中的流
 */
public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private String body;

    public ParameterRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        body = request.getReader().lines().collect(Collectors.joining());
    }

    @Override
    public BufferedReader getReader() throws IOException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        InputStreamReader inputStreamReader = new InputStreamReader(byteArrayInputStream);
        return new BufferedReader(inputStreamReader);
    }

    /**
     * 如何对 ServletRequest 进行 setParameter()
     * 后台通过 HttpServletRequest 中的 getParameter(String name) 方法对数据进行获取。
     * 如果后台想将数据放进去，下次请求或者其他请求时使用，只能通过setAttribute(String name, Object o) 放入然后从 getAttribute(String name) 获取
     * 无法通过 getParameter(String name) 获取,这里可以取巧，覆写getParameter方法。
     */
    @Override
    public String getParameter(String name) {
        return (String) super.getAttribute(name);
    }
}
